/*
Q:Go语言中的map是什么？
A:map是一种无序的键值对集合，也称为字典map中的key必须是唯一的，值可以重复
map提供了快速查找和插入的操作，适用于需要根据快速检索值的场景
*/
package main

import (
	"fmt"
	"sort"
)

func main() {
	grades := make(map[string]int)

	grades["Alice"] = 98
	grades["Bob"] = 85
	grades["Charlie"] = 95

	aliceGrade := grades["Alice"]
	bobGrade := grades["Bob"]
	charlieGrade := grades["Charlie"]

	fmt.Println("Alice's grade:", aliceGrade)
	fmt.Println("Bob's grade:", bobGrade)
	fmt.Println("Charlie's grade:", charlieGrade)

	orderMapTest()
	mapTest()
}

/*
我们使用make函数创建了一个map，键的类型为string，值的类型为int。
然后，我们通过键来添加学生的成绩信息，并通过键来获取学生的成绩。通过使用map，我们可以根据学生的姓名快速查找对应的成绩。

请注意，map是无序的，每次迭代map的顺序可能不同。
*/

/*
map的有序遍历
*/

func orderMapTest() {
	m := map[string]int{
		"b": 2,
		"c": 1,
		"a": 3,
	}

	keys := make([]string, 0, len(m))

	for k := range m {
		keys = append(keys, k)
	}

	sort.Strings(keys)

	for _, keys := range keys {
		value, ok := m[keys]
		if !ok {

		} else {
			fmt.Println(keys, value)
		}
	}

}

/*
在上述代码中，我们创建了一个map m，其中包含了键值对。然后，我们创建了一个切片 keys，并遍历map将键存储到切片中。
接下来，我们对切片进行排序，使用sort.Strings函数对切片进行升序排序。最后，我们根据排序后的键顺序遍历map，并访问对应的值。

通过以上步骤，我们可以按照特定顺序遍历map，并访问对应的键值对。
请注意，这里使用的是升序排序，如果需要降序排序，可以使用sort.Sort(sort.Reverse(sort.StringSlice(keys)))进行排序。
*/

func mapTest() {
	m := make(map[int]string)
	m[1] = "a"
	m[2] = "b"
	fmt.Println(m[1], m[2])
	delete(m, 2)
	result, ok := m[2]
	if !ok {
		fmt.Println("value not exist")
	}
	fmt.Println(m[2])
	fmt.Println("len of m[2]", len(result))
}

/*
接下来，我们使用delete函数从map中删除了键为2的元素。
然后，我们尝试输出键为2的值，但是输出为空。这是因为我们已经从map中删除了键为2的元素，所以它对应的值已经不存在了。

需要注意的是，当我们从map中访问一个不存在的键时，它会返回该值类型的零值。
在本例中，值的类型是string，它的零值是""。所以，当我们尝试输出键为2的值时，它返回的是空字符串。
*/
